{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "id": "huutQVSwrbv9"
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import tensorflow as tf\n",
        "import tensorflow.keras as K\n",
        "import matplotlib.pyplot as plt\n",
        "from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, UpSampling2D"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {
        "id": "rgW8cOairbv_"
      },
      "outputs": [],
      "source": [
        "np.random.seed(11)\n",
        "tf.random.set_seed(11)\n",
        "batch_size = 128\n",
        "max_epochs = 50\n",
        "filters = [32,32,16]\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "vPb5NiOcrbwB",
        "outputId": "13cbe120-1445-41a0-a8ee-c5d8cb9b069e"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz\n",
            "11493376/11490434 [==============================] - 0s 0us/step\n",
            "11501568/11490434 [==============================] - 0s 0us/step\n"
          ]
        }
      ],
      "source": [
        "(x_train, _), (x_test, _) = K.datasets.mnist.load_data()\n",
        "\n",
        "x_train = x_train / 255.\n",
        "x_test = x_test / 255.\n",
        "\n",
        "x_train = np.reshape(x_train, (len(x_train),28, 28, 1))\n",
        "x_test = np.reshape(x_test, (len(x_test), 28, 28, 1))\n",
        "\n",
        "noise = 0.5\n",
        "x_train_noisy = x_train + noise * np.random.normal(loc=0.0, scale=1.0, size=x_train.shape)\n",
        "x_test_noisy = x_test + noise * np.random.normal(loc=0.0, scale=1.0, size=x_test.shape)\n",
        "\n",
        "x_train_noisy = np.clip(x_train_noisy, 0, 1)\n",
        "x_test_noisy = np.clip(x_test_noisy, 0, 1)\n",
        "\n",
        "x_train_noisy = x_train_noisy.astype('float32')\n",
        "x_test_noisy = x_test_noisy.astype('float32')\n",
        "\n",
        "#print(x_test_noisy[1].dtype)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "id": "10gjVXStrbwC"
      },
      "outputs": [],
      "source": [
        "\n",
        "class Encoder(K.layers.Layer):\n",
        "    def __init__(self, filters):\n",
        "        super(Encoder, self).__init__()\n",
        "        self.conv1 = Conv2D(filters=filters[0], kernel_size=3, strides=1, activation='relu', padding='same')\n",
        "        self.conv2 = Conv2D(filters=filters[1], kernel_size=3, strides=1, activation='relu', padding='same')\n",
        "        self.conv3 = Conv2D(filters=filters[2], kernel_size=3, strides=1, activation='relu', padding='same')\n",
        "        self.pool = MaxPooling2D((2, 2), padding='same')\n",
        "               \n",
        "    \n",
        "    def call(self, input_features):\n",
        "        x = self.conv1(input_features)\n",
        "        #print(\"Ex1\", x.shape)\n",
        "        x = self.pool(x)\n",
        "        #print(\"Ex2\", x.shape)\n",
        "        x = self.conv2(x)\n",
        "        x = self.pool(x)\n",
        "        x = self.conv3(x)\n",
        "        x = self.pool(x)\n",
        "        return x"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "id": "OEjWhvjqrbwD"
      },
      "outputs": [],
      "source": [
        "\n",
        "class Decoder(K.layers.Layer):\n",
        "    def __init__(self, filters):\n",
        "        super(Decoder, self).__init__()\n",
        "        self.conv1 = Conv2D(filters=filters[2], kernel_size=3, strides=1, activation='relu', padding='same')\n",
        "        self.conv2 = Conv2D(filters=filters[1], kernel_size=3, strides=1, activation='relu', padding='same')\n",
        "        self.conv3 = Conv2D(filters=filters[0], kernel_size=3, strides=1, activation='relu', padding='valid')\n",
        "        self.conv4 = Conv2D(1, 3, 1, activation='sigmoid', padding='same')\n",
        "        self.upsample = UpSampling2D((2, 2))\n",
        "  \n",
        "    def call(self, encoded):\n",
        "        x = self.conv1(encoded)\n",
        "        #print(\"dx1\", x.shape)\n",
        "        x = self.upsample(x)\n",
        "        #print(\"dx2\", x.shape)\n",
        "        x = self.conv2(x)\n",
        "        x = self.upsample(x)\n",
        "        x = self.conv3(x)\n",
        "        x = self.upsample(x)\n",
        "        return self.conv4(x)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {
        "id": "vW2F7zkrrbwF"
      },
      "outputs": [],
      "source": [
        "class Autoencoder(K.Model):\n",
        "    def __init__(self, filters):\n",
        "        super(Autoencoder, self).__init__()\n",
        "        self.loss = []\n",
        "        self.encoder = Encoder(filters)\n",
        "        self.decoder = Decoder(filters)\n",
        "\n",
        "    def call(self, input_features):\n",
        "        #print(input_features.shape)\n",
        "        encoded = self.encoder(input_features)\n",
        "        #print(encoded.shape)\n",
        "        reconstructed = self.decoder(encoded)\n",
        "        #print(reconstructed.shape)\n",
        "        return reconstructed"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "__T5RzFkrbwF",
        "outputId": "2118ed31-5565-4ecc-f97e-bb7b541c4ce6"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Epoch 1/50\n",
            "469/469 [==============================] - 24s 25ms/step - loss: 0.2047 - val_loss: 0.1504\n",
            "Epoch 2/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1418 - val_loss: 0.1323\n",
            "Epoch 3/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1287 - val_loss: 0.1239\n",
            "Epoch 4/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1219 - val_loss: 0.1182\n",
            "Epoch 5/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1175 - val_loss: 0.1152\n",
            "Epoch 6/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1146 - val_loss: 0.1130\n",
            "Epoch 7/50\n",
            "469/469 [==============================] - 8s 16ms/step - loss: 0.1124 - val_loss: 0.1102\n",
            "Epoch 8/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1108 - val_loss: 0.1090\n",
            "Epoch 9/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1094 - val_loss: 0.1079\n",
            "Epoch 10/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1082 - val_loss: 0.1075\n",
            "Epoch 11/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1072 - val_loss: 0.1059\n",
            "Epoch 12/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1064 - val_loss: 0.1054\n",
            "Epoch 13/50\n",
            "469/469 [==============================] - 8s 18ms/step - loss: 0.1056 - val_loss: 0.1046\n",
            "Epoch 14/50\n",
            "469/469 [==============================] - 8s 17ms/step - loss: 0.1051 - val_loss: 0.1040\n",
            "Epoch 15/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1045 - val_loss: 0.1035\n",
            "Epoch 16/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1040 - val_loss: 0.1030\n",
            "Epoch 17/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1036 - val_loss: 0.1031\n",
            "Epoch 18/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1031 - val_loss: 0.1023\n",
            "Epoch 19/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1028 - val_loss: 0.1017\n",
            "Epoch 20/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1024 - val_loss: 0.1015\n",
            "Epoch 21/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1022 - val_loss: 0.1013\n",
            "Epoch 22/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1019 - val_loss: 0.1018\n",
            "Epoch 23/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1018 - val_loss: 0.1014\n",
            "Epoch 24/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1014 - val_loss: 0.1007\n",
            "Epoch 25/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1013 - val_loss: 0.1008\n",
            "Epoch 26/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1011 - val_loss: 0.1010\n",
            "Epoch 27/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1008 - val_loss: 0.1002\n",
            "Epoch 28/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1007 - val_loss: 0.1004\n",
            "Epoch 29/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1005 - val_loss: 0.0998\n",
            "Epoch 30/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1004 - val_loss: 0.0999\n",
            "Epoch 31/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1003 - val_loss: 0.1005\n",
            "Epoch 32/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.1001 - val_loss: 0.1000\n",
            "Epoch 33/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.0999 - val_loss: 0.0993\n",
            "Epoch 34/50\n",
            "469/469 [==============================] - 8s 16ms/step - loss: 0.0999 - val_loss: 0.0997\n",
            "Epoch 35/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.0998 - val_loss: 0.0996\n",
            "Epoch 36/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.0997 - val_loss: 0.0994\n",
            "Epoch 37/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.0995 - val_loss: 0.0990\n",
            "Epoch 38/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.0995 - val_loss: 0.0989\n",
            "Epoch 39/50\n",
            "469/469 [==============================] - 8s 16ms/step - loss: 0.0994 - val_loss: 0.0987\n",
            "Epoch 40/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.0993 - val_loss: 0.0989\n",
            "Epoch 41/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.0992 - val_loss: 0.0986\n",
            "Epoch 42/50\n",
            "469/469 [==============================] - 7s 16ms/step - loss: 0.0991 - val_loss: 0.0988\n",
            "Epoch 43/50\n",
            "469/469 [==============================] - 8s 16ms/step - loss: 0.0991 - val_loss: 0.0986\n",
            "Epoch 44/50\n",
            "469/469 [==============================] - 8s 16ms/step - loss: 0.0989 - val_loss: 0.0986\n",
            "Epoch 45/50\n",
            "469/469 [==============================] - 8s 16ms/step - loss: 0.0989 - val_loss: 0.0987\n",
            "Epoch 46/50\n",
            "469/469 [==============================] - 8s 16ms/step - loss: 0.0988 - val_loss: 0.0986\n",
            "Epoch 47/50\n",
            "469/469 [==============================] - 8s 16ms/step - loss: 0.0988 - val_loss: 0.0984\n",
            "Epoch 48/50\n",
            "469/469 [==============================] - 8s 16ms/step - loss: 0.0987 - val_loss: 0.0985\n",
            "Epoch 49/50\n",
            "469/469 [==============================] - 8s 16ms/step - loss: 0.0986 - val_loss: 0.0993\n",
            "Epoch 50/50\n",
            "469/469 [==============================] - 8s 16ms/step - loss: 0.0986 - val_loss: 0.0987\n"
          ]
        }
      ],
      "source": [
        "model = Autoencoder(filters)\n",
        "\n",
        "model.compile(loss='binary_crossentropy', optimizer='adam')\n",
        "\n",
        "loss = model.fit(x_train_noisy,\n",
        "                x_train,\n",
        "                validation_data=(x_test_noisy, x_test),\n",
        "                epochs=max_epochs,\n",
        "                batch_size=batch_size)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 279
        },
        "id": "rvid4TwYrbwH",
        "outputId": "fa029a01-7daf-4028-d965-70e2c1ed78fc"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "\n",
        "plt.plot(range(max_epochs), loss.history['loss'])\n",
        "plt.xlabel('Epochs')\n",
        "plt.ylabel('Loss')\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 248
        },
        "id": "JU8yjR4JrbwI",
        "outputId": "f30cf71a-1a20-447f-ac8d-489f8e472b5f"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAABG0AAADnCAYAAACkCqtqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOydd6AdVfm1X9IICakkQAotiBI6IYiAiHQEVLogHVR6VRCRLgiiFGnSBISAIFKll5+0ANKkSG8hkIQaAoFQEnK+P/xm59nr3pmcezk3nsB6/npP9tw5c2Zml5m8611z1Gq1MMYYY4wxxhhjjDHNRaf/9QEYY4wxxhhjjDHGmJb4pY0xxhhjjDHGGGNME+KXNsYYY4wxxhhjjDFNiF/aGGOMMcYYY4wxxjQhfmljjDHGGGOMMcYY04T4pY0xxhhjjDHGGGNME9KlLRv36NGj1rdv34iImDBhQul2Cy20UPb51VdfbXW7eeaZJ/v87rvvprh79+5ZW58+fVL85ptvprh///7ZdoMHD07xf/7zn9L9ffLJJyleYoklsrann346xV26zDhFiyyySLbdRx99lOIPPvgga/vwww9b/btXXnkl2kOtVpujXX8ozDHHHMnjfc4558zavvGNb6T4iSeeyNr4G954440Uf/zxx6XfVXXOF1hggRS/9dZb2XZf//rXU/zkk0+muLj3Crp161a6j06dZryPnD59eoq7du2abTd16tTS4+/cuXOKP//889LtyBxz5JepVqvx4zu1Wm1gXTuaCV27dq0V55f3mtK7d+/s87Rp01I8ZcqUFM/kuEtZcMEFU6znkvvgPVNF1dgx77zzplivN5lrrrmyz7xHeQ/NN9982XbPP/98iqt+f0f0xSr0nLz++usprrovOXaxP0REfPbZZynmOKDf9c4776R44sSJKV5qqaWy7eoda+ul3vtxwIAB2WeOyVVjUzSwL/I6rrDCClnbc889l+Kqfkp0nuGc0a9fv6ztvffe43GkWM8X73XOn1XXSsfbSZMmpZjnXe/ByZMnp5jjTXvRfsrjb1Rf7NGjR61YY1SNVXq+dP1RMH78+NJ9VF3fqmvIe+uRRx5J8fDhw7Pt2O/1t7z99tsp5lpJj7dq7uN48emnn0Y98JgiWtwXDeuLnTt3rhVzvB7bwgsvnGKuCSIixo4d+4W/m2uLqnUFzx/nZ14bhWuiiHyuIjr+VI2HZety3Qe/i307YsZvmTp1anz++ecN6YsDBgyoFdeK93lEfh/17Nkza+OxDRo0KMXjxo3Ltpt//vlTPPfcc2dtL774YqvHVPWMUAXHB70f+Zn9oWpuVeq953jedA3MdfT777/fIfNi1ZqsXoYMGZJ9Zn/heiYi7+vvv/9+6feWzXec62YG54Qll1wyxXrv8hzwnOsx9ujRI8Vco0fkz02vvfZa6THNijUq7yldh3He4bM7f2dE++YShfvncej65d///neKOfdF5Gtq9llds+l9Vga/W9fe7H9cy7RCq31xjnofziIiBg8eXNt1110jIuLII48s3e7cc8/NPv/0pz+d8YVYlOy4447ZdhdccEGKF1988aztBz/4QYpPOOGEFG+77bbZdkcccUSKF1tssRRXDYT6gmKZZZZJMR8UL7roomy7Bx98MMW33npr1nbvvfem+OKLL07xdtttF+2hIzohX9JERPzzn/9Msd7U/A0nnnhiih977LHS79Jr+Oyzz6b41FNPTfHpp5+ebXfLLbekmAvczTbbLNuOLwxOPvnkrI0TOhcuOvDrhE7aM4jrizAZiB6p1Woj69rRTOjVq1dt5Mj/7uruu+/O2rgg/d73vpe1cZB49NFHUzyT4y7ljDPOSLE+IHARcfzxx9e1v/POOy/7/JOf/CTF++yzT4p5/yjLLrts9vnxxx9PMe+hAw44INvuu9/9boqrFkCz+qXNn//85+zzgQcemGK+SFEGDpwx3usCd8yYMSledNFFU6xjN8fkSy+9NMXsyxH1j7X1Uu+LH94fEREPPfRQinndW6FhfZHXUefT1VZbLcWcE6rgWBuRzxk/+tGPsrbLL788xVwI6uKC98zvf//7FFeN0RtvvHHWds0116T4Zz/7WYp1bOQ8UvUgWi889oj8+BvVFwcNGlTbaaedIiLiuOOOK91O7+0tt9ySx5JirkOUSy65JPu8zTbbpLjqGnL/XEfxno/IF65/+MMfsjaO18cee2yKf/3rX2fbceGqY8zXvva1FJc95CpVL96igX2xe/futeLFs77Y+Mtf/pJifXjbbbfdvvB3Dx06NMV8CFC47lpzzTVT/Kc//an0b+64447s81prrdXqdjr+PPDAAyl+6qmnsjYdO8v2sc4666T49ttvz9qKl0mvvvpq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4GuvvXaK1YqPlrdqWUpNL/XNWueCdR1YuyAit1U95ZRToox11lknxaqzK2w499hjj3j++ecbolGcd955a0VdIbUgJGpFRmv1ESNGpJgWa4rau1E3zuukelfVABZoPQFaFavOlHU1eF71fuG9pHVFWP+mXn0q68RE5Pf4vffeO0tshqt0zrRhrbduShW0x1V9ar1jS5WGm1betN5daaWVsu1Yx4Ya5oiW9azaQ6H5nzRpUkydOrXD9cK8Fz/99NOsTS14C7p37559/vjjj1O86qqrZm3U7dKGW68Z60jRsrIKHceGDRvW6na0l46IuPDCC1OsYwdrh7CuAceiiLwGAusXReS1jaKB2n3WCau6l9XqnnMoaxpovSCi14eWqJx3ae0ckf926vXVfpq1PrS2hdbJaW1/Efn9pLXpWIOJNW3Umpq1OThmRUQceuihEfHf+Xj8+PEN6Yv12tPWi96XXNuoRTfrfbFNr83++++f4pNOOqn0u9tSE+OLQivWKVOmZG1cc6mluNThaVhfXHrppWuF7a6uF1hPUNeDvD6sc6E1Deq142U/VXtfrg2rYH0GrWnDGg9E7XC5ltKaZ7SQ51yhVNW5KtYXTz75ZHz44YcNnxcLG+MC1i7htdA2rgFYZzEir4Vzww03lB4H60voGpVzS739jWv9iIjll18+xb/73e9K/45jAmurROT3MccLrpsi8ntpJsySNSphTb2IvF4X68Xo8wr7GGu2ReS1U1nzRGsOlV27iRMnZp9Zk0tra953330p/tWvfpVifTZiLRY+T0VE7Lbbbinmc432S9YTY02kiHwMa1TdRV5Dre/K8aMK9mEdt7jG0FqUZOONN06xPq8T3hP6DoF1OrUGLecnrkOr0NpDrEvE+1afTatgLdlTTz3VNW2MMcYYY4wxxhhjZhf80sYYY4wxxhhjjDGmCeky801m8N5776XU4V122SVrq7LIZRv/TtNXmdrElOGIPI2NVoiUTETktnpMJ2b6mX7Xu+++m7Vp+ltrxx6RpyhrqpimAxdoGiRT2m+77basrUh3pJTri/L222+3SJMtoH0urTwj8vPFc64W5jwPDz74YNZGe3CmLGr6cBlqbc20UU1zVKlI2fES2ppHtLAlrQv9zbQdrZI9tJU55pgjSUE0TZu/nSm4EXm6JdOLt91222w7yv00lZD9lpIoWroXx1jA++ecc87JtqMU5u23387aKK256qqrUqxW42eeeWaK2yuHYp9lymtEbiHZKIYOHZpS5XX8YB/T8Yj3Ea0Kq8YJteF++eWXU0wbbh1PmapM2Jcj8tRlTf09//zzU1xlbf3000+nWO1c77777hRTgrjddtu1enwRLdPnl1hiiVa/64vy8ccft5C8tIZKign/Xm3XKTvRcY4ywaWXXjrFOqex71DmpnMB73OVkBBKm3TcpC0wJaYRubyCc8Dvf//7bLtC4tIaen81gkmTJqV7U9cKnPdXXHHFrI3jxCqrrJJi3vMREf37908xrVIj8n7w0EMPpVhto7UPF1TdV9qfKRsp69ttYezYsSnW+ZkSTF7rjuQ///lPGhP79euXtencTHhfVsmeKDt58cUXS7ejLEmvD4+L1scqh+O6iNbHEbnMgGuMKim+WplT8sPUfo6TERE9e/ZMMdeIETPmjunTp5d+7xdBzzHHdLVt33fffVPMdYnOVbrOLoMSR5WAlq3vFco6VK575JFHtvo3YsGdjesKy1IQzu8REZ07dy7dB9dmHSWtrJJrbbTRRlkbn9t4PHpfsq2QJxfQepvyWv19nAs553C8jsglgnpPqo14gVqUcx8iD83mHH437bIj8rWzSiYPPvjgiIh47bXXWj2eL4qWiODaQ/sD5xbGKu/jvafyKLG/Lj0uStJ23nnnFOsczH3o8y0lUZR0r7baaqXfW/VMQEmUyq241qcULqLlfdcazrQxxhhjjDHGGGOMaUL80sYYY4wxxhhjjDGmCWmTe1S91cA1fUwrwBf8+te/zj5TbqRVs5lWxfRiTdekmw3TUJk6GRHxt7/9LcWs2ByRSzKYqq7uCFWOWZSoULagThhMqdbq3HfccUeKO6IauEKpBc9PRMvzXAarZo8bN66uv9F0cVblPvbYY1Os546ymldeeSVrYyo007Q1pfCWW24pPS6mGdK9bKeddsq2Y8q8pl/yXnr55Zc7pDK/Sor23nvvFF922WVZGyuoa3X1RsOxpSrFt0pawtRsphKqdIPXVR1rmGbOlEtKRiLy1FN1DSlSdi+99NJ48803G9IX6Tqksj3KGjStn6molLeojIpjkrohEKZti8NSKZqCq3ImQimSpjgTjjHqvLDNNtuk+JJLLindB2VUKtejQ9OBBx44y10yFM5P7733Xop/9KMfZdvRjUvTwClr4LipTni8n5j2r+5ylAHMPffcWZvKmQt0zKMkimnqEdXjbXto1Ly47LLL1gqph64VOLaojJGyA0qf9VzR2UZTs5daaqkUc5xUJyBCiQfXPEqVg9r666+fYsrdFHVcqXde51j75JNPZm1MO7/gggsa1hc7depUKxwbOQ9G5I5qN954Y9bWaFkI+6n2AcoHec+o8yTR46PchFITlTvy3q1yC62C9xDH0IgZ99D+++8fL7zwQsPXqHrvsTTCqaeeWroPSo9UhkQ5MKUVEdXOt4TPDJdffnmKVdJIWaDec9/5zndSzH6vUsKBAwfWdUxEHRwpoSuTZf1/GtYXe/fuXSvufZXF0N1J4fMinb+4do3IXdi09EDfvn1TfPvtt6dYnzkptaW0kBItRV2DVN5VoHKfqvPOe5LrOF3TPf/88ynWa0w64nmRz6oR+frliSeeyNrqlWidd9552IoDwwAAIABJREFUKdbnwDJ4riLyeYz3i5aGIH369Mk+X3/99Slmv6xCr+dM+lWCc6E+F9FR9cILL7R7lDHGGGOMMcYYY8zsgl/aGGOMMcYYY4wxxjQhfmljjDHGGGOMMcYY04S0yfK7U6dOqcbLhx9+WLpdWQ0bhfVKInI9V6FLLqC9WFV9FVr9saaG6s1Yv6VKZ691bEiV/nW++eZLMTXHX//617PtqFlUzWBhFVavVq6taN0DautV+1mmw1PLMlqdnX766VnbXnvt1epxUNcYkddZ6N27d4qrNI/6Xby+tMfUegL8u7Lj0/2p7StRvSutMGkv+EXp3bt3ul+09oHWsSHtqWOjNR7uv//+FLNWykcffZRtx77D+0cte994440Ua60a7lP3TzbffPPSNkLbv6o6BtRER1RbqbaXl19+ObbaaquIaGnNS9R+/M9//nOK77zzzhRPmjQp247XRutlsRZHlXUhtb4cn9SS+a233krx0UcfnbWV1bHR888aFGrXu/jii6eYdY44Z0RErLnmminW+jxLLrlkq8fxRenfv39ssMEGERExatSorO2KK65I8RZbbJG1sY4N0RpPtMMuvqeAc9eCCy6YYr2fWPeKNRK23377bDvakqpWnzUZeE11XOP8X2WLfN1116X4Bz/4QdbGGghqt/ub3/ym1X//IkyYMCGNS1r3rArWJCFal4g1ErSOBuulcW5V61+uibS2DmH9iu222y5rYx0I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nGJq5nXc5dhRpUmnHpyWkRF5va8qm04y55xzZp9Zw0NryLD21NFHH92wvrjIIovUitowrF0SkVubqj56+eWXTzG10tTjR0Tst99+pd9Ni1/qvueZZ55sO15/6vNVu0/ULpo23/VaeipiaVnX32h9hiWWWCIiGmv5vfDCC9cK20+1bac9tNrUsx4ExxatPUEL0Eaj55Hzutao4lqMtS2q6rHwmkX8dwwsaETtgmjgvNivX79acU9fc801WRuvo67lWEOJ1uVq+c01mt6XahNcD5wLdS3OmnNaY5BU1ZxhzTPWAmsLRX+LyK99xIy1wdlnnx3jxo1r+LzIujIR+di40UYbZW1ad6aANSUj8nmmXstvnuOI6to+hHXVOM9GRBxzzDEp5lpE7yvWgmS9sIiIzp07p1hrydULx7vNN9+8YX2xb9++taIm6HXXXVe6HefliIill166EV/fKvPPP3/2meMe1w6HH354th1rVeo6twzWWIrIa9WofTlrrFbVkiN67+6xxx4R8d/r+dZbbzWkLw4ZMqRWzCes3aOcdtpp2edx48alWNeKpKquJutZ0VZdn1VY45bvDcr6ckTEXHPNlX1m/Zuq8Y7o/svepfTq1Sv7zBp9+pulDpxr2hhjjDHGGGOMMcbMLviljTHGGGOMMcYYY0wT0m551Prrr5+1UU5AyURERM+ePVNMadN5552XbacWl2Uwxb5IaS5guhVTqn73u99l21XZkh955JGtxgrTFhdZZJGsjSno/G61k6T9J/8mYoZF3MMPPxwffPBBQ9Ld5ptvvlohUdOUT9oMzz333FkbU7p4Xs8666xsO0oouL+IPGV89OjRKa6ydaTlOuUEEdVyrrK0UU0lp61mjx49srYzzjij1X0X8rIC2qjOhIalntabtsiU8IjydHb2m4j6LcApydG0RcroNB20DLWo5T3DdESVmgwcOLD0uygBodznoIMOyrarkvUU57qRqaddu3atFbI7lUbWe+4ohaBENSKXff7hD3+o65gogYnIUz6r7Igfe+yxuvZP1Fp5ySWXTDGtcHX/Cy20UIqHDRuWbfePf/wjxWJlmkkd7rjjjg6RKlahkiWO/ZS8UcISkct1OR62Bdpi0ipVodxs+vTpWRvlouz3arfKPkY7+YhcMsnrz7+JyGWdet4Kqcg999wTkyZN6nCpIseJE044IWt74okn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nnvuVuOIiI8//jjFb731VtZm6dr/Hl5XXw9jjDHmfwNLQOjn6dOntxobE+FMG2OMMcYYY4wxxpimxC9tjDHGGGOMMcYYY5oQv7QxxhhjjDHGGGOMaUJc08Z0GFqfhLVrfvvb36Z40KBB2XbUd7KOycCBA7PtWMeEtTciIsaNG5fiyy67rC2HbWYxvHY77rhj1rbWWmul+PDDD0/x888/3+HH9VWB9U569OiRtfH8H3XUUSmef/75s+2eeuqpFO+6665Z25gxY1L8+eeff6FjNTm8dmWxfmZNm7Zo5stq4VR9lzX5/1t0Dmb/5rX55JNPsu2mTp2aYtdAajvaJ8j/6nx27do1+9y7d+8U8/rrveAx25hy2Ne7dJnxSN2nT59su+WXXz7FK6+8cta20EILpfjyyy9P8T333JNtx9qB5quJM22MMcYYY4wxxhhjmhC/tDHGGGOMMcYYY4xpQiyPMg2FqYLrrrtu1nbSSSelmFInWndHRLz66qspHjt2bIr79++fbTfffPOlWC2IaRXtFP3mZq655krxvvvum7X169cvxZRROWW/cTCld4EFFsja9tlnnxQPHz681b+JiBg5cmSKf/KTn2RtJ554YorffffdFPsath2VXVBKymuiUgi28W803bpKFsNxlPtQCQ5lF5MmTcraKHc1HQOvNSXJERHbbbddih944IEUjxo1KtvutddeSzFlyBHutwXaF9kPuB7R88c+x7aOWKd07tw5xcsuu2zWtvrqq6f43nvvTfFjjz2WbfdVlUdVyU3ZB9wfvhzwGrPfROTr0MGDB2dtK664Yoo33HDDFI8YMSLbjnIpvZ84Diy++OIpPvnkk7PtbrrpphR/9NFHrfwK82XHmTbGGGOMMcYYY4wxTYhf2hhjjDHGGGOMMcY0IbNEHsVUs6oU7s8++yzFTNOO+N+lIDajC0AzQ6nLSiutlLUxBfDll19OMWVTERG33357q/v+1re+lX3ea6+9UqzOUoSp/Kb5GDJkSKtxRC6vmDBhQord974YHNeY+rvnnntm21H2pOM1YRtdEiIihg4dmuL33nsvxV/VtPtGwvmU8oyePXtm21Guwb956623su103iVl6eOLLrpott1yyy2X4htvvDFrszyq4+FceNhhh2Vt7ItM17/++uuz7V5//fUOOrovD+oOs9NOO6WYbjC6nnnwwQdT/P77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\n",
            "text/plain": [
              "<Figure size 1440x288 with 20 Axes>"
            ]
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "number = 10  # how many digits we will display\n",
        "plt.figure(figsize=(20, 4))\n",
        "for index in range(number):\n",
        "    # display original\n",
        "    ax = plt.subplot(2, number, index + 1)\n",
        "    plt.imshow(x_test_noisy[index].reshape(28, 28), cmap='gray')\n",
        "    ax.get_xaxis().set_visible(False)\n",
        "    ax.get_yaxis().set_visible(False)\n",
        "\n",
        "    # display reconstruction\n",
        "    ax = plt.subplot(2, number, index + 1 + number)\n",
        "    plt.imshow(tf.reshape(model(x_test_noisy)[index], (28, 28)), cmap='gray')\n",
        "    ax.get_xaxis().set_visible(False)\n",
        "    ax.get_yaxis().set_visible(False)\n",
        "plt.show()"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "name": "python"
    },
    "colab": {
      "name": "ConvolutionAutoencoder.ipynb",
      "provenance": []
    },
    "accelerator": "GPU"
  },
  "nbformat": 4,
  "nbformat_minor": 0
}